Spring Web MVC 와 Spring WebFlux의 근본적인 비교

프로젝트를 진행하면서 스프링 게이트웨이를 만들었는데, 이 때 참고한 사례에서 webflux로 구현한 몇몇 사례들을 봐서 간단하게 찾아본 차이를 알아보겠습니다. 큰 틀에서 봤을 때, Spring MVC와 WebFlux는 Spring 생태계 내에서 웹 애플리케이션을 구축할 수 있는 프레임워크들입니다. 하지만 이들은 실행 방식과 설계 철학에서 근본적으로 다릅니다. 핵심 차이는 바로 **블로킹(Blocking) 대 논블로킹(Non-blocking)**에 있습니다.

핵심 개념: 커피숍 비유

이 차이를 이해하기 위해 다음과 같은 커피숍 시나리오를 생각해 봅시다.

시나리오 A: 블로킹 바리스타(Spring Web MVC)

이것이 바로 명령형(Imperative), 요청당 스레드 모델입니다. 간단하고 직관적이지만, 많은 바리스타(스레드)가 대기하는 동안 자원이 낭비될 수 있습니다.

시나리오 B: 논블로킹 바리스타(Spring WebFlux)

이것이 바로 리액티브(Reactive), 이벤트 루프(Event-Loop) 모델입니다. 조율이 복잡하지만 자원 활용이 매우 효율적이며, 한 사람이 여러 일을 동시에 처리할 수 있습니다.

Spring Web MVC (블로킹 바리스타)

전통적인 Spring 웹 프레임워크로, 10년 이상 널리 사용되었습니다.

Spring WebFlux (논블로킹 바리스타)

Spring 5에서 도입된 최신 리액티브 웹 프레임워크입니다.

요약 표

특징 Spring Web MVC (블로킹) Spring WebFlux (논블로킹)
프로그래밍 패러다임 명령형 리액티브
스레드 모델 요청당 전용 스레드 이벤트 루프
동시성 처리 스레드 풀 사이즈에 제한 매우 높은 동시성 지원
대표 서버 Tomcat (서블릿 API 기반) Netty (리액티브 스트림 기반)
주요 의존성 spring-boot-starter-web spring-boot-starter-webflux
코드 스타일 직접 객체 반환 (User) Mono<User>, Flux<User> 반환
적합 대상 전통적 CRUD, 블로킹 라이브러리 사용 API 게이트웨이, 스트리밍, 고동시성 API

프로젝트에서 API 게이트웨이는 수많은 연결을 효율적으로 처리해야 하므로 WebFlux를 사용하고, 사용자 서비스는 비즈니스 로직과 DB 작업 위주이기에 Spring MVC를 사용합니다.